package Jihe;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.function.BinaryOperator;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/*
*Stream接口：不是存储数据结构，数据源可以是一个集合，为了函数式编程创造，
* 惰式执行，数据只能被消费一次
*
* 两种类型的操作方法：
* 1.中间操作(生成一个Stream)
* 2.结束操作(执行计算操作)
*
* */
public class StreamDemo {
    public static void main(String[] args) {
    Stream<String> stream =  Stream.of("good","good","study","day","day","up");
        //foreach方法 属于结束操作，直接打印最值
//    stream.forEach(System.out::println);
//  stream.forEach((str)->System.out.println(str));

        //惰性执行，filter没有被执行是不会返回结果
        //filter方法断言 长度小于3的元素 把它输出出来 属于中间操作返回出来的还是Stream
//        stream.filter((s)->s.length()>3).forEach(System.out::println);

        //distinct 去重复的方法 属于中间操作返回出来的还是Stream
//        stream.distinct().forEach(System.out::println);

        //map 将流里面的元素转换为大写并输出
        //stream.map(s -> s.toUpperCase()).forEach(System.out::println);

        //flatmap 将流里边的两个集合放到一起遍历
//        Stream<List<Integer>> ss = Stream.of(Arrays.asList(1,2,3),Arrays.asList(4,5));
//         ss.flatMap(list->list.stream()).forEach(System.out::print);

        //reduce 求最大值，最小值，总和
//        BinaryOperator binary = new BinaryOperator() {
//            public Object apply(Object o, Object o2) {
//                return null;
//            }
//        };
//       Optional<String> opt =  stream.reduce((s1, s2)->s1.length()>=s2.length()?s1:s2);
//        System.out.println(opt.get());

        //collect *** 根据流生成不同的集合 , 通过.stream又可以获取到stream互相转换
      List<String> list = stream.collect(Collectors.toList());
      list.forEach(System.out::println);

        //  :: -> 方法的引用
        //可以用来引用静态方法 Integer::valueOf
        //引用对象的方法   list::add
        //引用构造方法    ArrayList::new
        
    }
}
